package com.imooc;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import tk.mybatis.spring.annotation.MapperScan;

/**
 * @author gcq
 * @Create 2022-01-02
/**
 * @link https://www.cnblogs.com/YuyuanNo1/p/11400638.html
 * 事务传播
 * Propagation
 *  REQUIRED:【默认】
 *      使用当前的事务，如果当前没有事务，则自己新建一个事务，子方法必须运行在一个事务中的；
 *      如果当前存在事务，则加入这个事务，成为一个整体
 *      举例：领导没饭吃，我自己有钱, 自己吃,领导有饭吃，自己也有饭吃
 *  SUPPORTS:【支持，主要做查询】
 *      如果当前有事务，则使用事务，如果当前没有事务，则不使用事务【非事务方式】
 *      举例：领导没饭吃，我也没饭，领导有饭，我也有饭
 *  MANDATORY:【强制】
 *      如果已存在一个事务，那么支持当前这个事务，如果没有一个活动的事务，则抛出异常
 *      举例:领导必须管饭，不管饭没饭吃，我就不乐意了，我就不干了（抛出异常）
 *  REQUIRES_NEW:【需要新的】
 *      如果当前有事务，则挂起事务，并且自己创建一个新的事务给自己使用
 *      如果当前没有事务，则同 REQUIRED
 *      举例:领导有饭吃，我不要，我自己买了自己吃
 *  NOT_SUPPORTED:【不支持】
 *      如果当前有事务，则把事务挂起，自己不适用事务去运行数据库操作【总是非事务执行，并挂起任何存在的事务】
 *      举例:领导有饭吃，分一点给你，我太忙了放一边，我不吃
 *  NEVER【绝不】
 *      总是非事务执行，如果存在一个活动事务，则抛出异常
 *      举例：领导有饭吃，我偏不吃 我热爱工作 我抛出异常
 *  NESTED:【嵌套】
 *      如果当前有事务，则开启子事务（嵌套事务）嵌套事务是独立提交或回滚
 *      如果当前没有事务，默认使用 REQUIRED
 *      但是如果主事务提交，则会携带子事务一起提交
 *      如果主事务回滚，则子事务一起回滚，相反，子事务异常，则父事务可以回滚或不回滚
 *      外层事务失败，会回滚内层事务做的操作，而内层事务失败，并不会引起外层事务的回滚
 *      举例: 领导决策不对，老板怪罪，领导带着小弟一同受罪，小弟出了差错，领导可以推卸责任。
 *
 *
 * 耦合度判断
 * 两个接口条件不同，需要条件判断，如果考虑到后续条件，减少耦合度，所以还是要单独分开
 */
// spring security 访问接口要求登录 因此排除登陆相关类
@SpringBootApplication(exclude = {SecurityAutoConfiguration.class})
// 扫描 mybatis 通用 mapper
@MapperScan(basePackages = "com.imooc.mapper")
// 扫描所有包以及相关组件包
@ComponentScan(basePackages = {"com.imooc", "org.n3r.idworker"})
public class Application {
    /**
     * 自动装配
     * @param args
     */
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}